import assemble from "@/common/app/assemble.js";
import utils from "@/common/app/utils.js";

export default {
  /**
   * buildAppBaseConfig 根据框架配置构造框架基础的请求参数
   */
  buildAppBaseConfig(options = {}) {
    const serverConfig = utils.getServerConfig();
    // 如果配置了使用本地模拟桩时，请求方式需修改成GET方式，同时URL也需使用模拟桩的服务器URL进行拼接
    const method =
      (serverConfig.localMock || options.isMock ? "GET" : options.method) ||
      "POST";

    // 根据系统配置获取完整的接口地址
    let url = utils.getApiUrl(options.url, options.isMock);

    let headers = {};
    Object.assign(headers, options.headers);

    let data = {}
    // 如果当前请求是GET请求，则需要将参数封装成URL字符串参数
    // JSON2String：如果当前请求需要将JSON参数转换为URL参数，也需要将参数封装为URL字符串参数
    if ((method && method.toUpperCase() === "GET") || options.JSON2String) {
      const paramStr = utils.jsonToQueryString(options.data || {});
      if (paramStr && paramStr.length) {
        url += "?" + paramStr;
      }
    } else if (options.data) {
      data = options.data;
    }

    return {
      method,
      url,
      headers,
      data,
    };
  },

  /**
   * --------- 该方法不需要实现，只进行定义 ---------
   * buildAppCustomeConfig 封装业务定制的接口请求参数，根据业务需要进行封装
   * @param {Object}  options 请求参数对象
   *                  {String}  url: 接口地址
   *                  {String}  method: http接口请求方式：GET、POST、DELETE、PUT、UPDATE
   *                  {any}     data: 接口请求数据，任意类型
   *                  {Object}  headers: 接口请求消息头参数配置
   *                  {String}  message: 接口错误的提示消息，如果该字段不为空，则当请求失败时，会在接口调用处处理错误消息的展示，业务侧则不需要进行消息提示处理
   *                  {Boolean} isMock: 当前接口是否需要使用本地模拟桩数据
   *                  {Boolean} unneedLog: 不需要打印接口日志，如果不传入该参数，默认会打印接口日志，如果某个接口响应的结果数据太大，该参数配置为true，不打印接口日志
   * --------- 该方法不需要实现，只进行定义 ---------
   */
  buildAppCustomeConfig(options) {
    return options;
  },

  /**
   * --------- 该方法不需要实现，只进行定义 ---------
   * proccessResponse 处理后台返回的响应信息
   * --------- 该方法不需要实现，只进行定义 ---------
   */
  proccessResponse(res) {
    return res;
  },

  /**
   * --------- 该方法不需要实现，只进行定义 ---------
   * 当前响应是否成功，不同的后台服务包含不同的响应结构，根据后台响应结构判断请求是否成功
   * @param {Object} res 当前接口的响应参数
   * --------- 该方法不需要实现，只进行定义 ---------
   */
  isResponseSuccess(res = {}) {
    return res.success;
  },

  /**
   * --------- 该方法不需要实现，只进行定义 ---------
   * 封装当前响应的错误消息，将后台返回的消息信息封装至框架响应的message字段中
   * @param {Object} res 当前接口的响应参数
   * --------- 该方法不需要实现，只进行定义 ---------
   */
  getResponseMessage(res = {}, options = {}) {
    return res.message || options.message || "";
  },
  // 具体的方法实现在该模块中
  ...assemble.getAssembleData("tool", "request.js"),
};
